home *** CD-ROM | disk | FTP | other *** search
- {$g+,a+}
- unit crypt;
-
- INTERFACE
-
- procedure maketable(const seed:word);
- procedure encrypt(var data;const size,xoa:word);
- procedure setslide(const slide:word);
- function maxslide:word;
-
- IMPLEMENTATION
-
- const
- maxx=2028; { Max is a word! }
- var
- xortable:array[0..maxx]of byte;
- slidepos:word;
-
- procedure maketable(const seed:word); assembler;
- asm
- mov ax,seg xortable
- mov es,ax
- mov di,offset xortable
- xor cx,cx
- mov cx,maxx
- mov si,seed
- xor ax,ax
- @@loop:
- not ax
- inc ax
- neg ax
- add ax,cx
- and ax,si
- ror si,3
- rol ax,2
- xor ax,si
- inc si
- mov es:[di],al
- inc di
- dec cx
- jnz @@loop
- end;
-
- procedure encrypt(var data;const size,xoa:word); assembler;
- {
- ds:si => pointer to XorTable
- es:di => pointer to data
- ax => temporary
- => al is used for the thing that get changed,
- ah to hold a byte from the XORTABLE.
- bx => used for temporary calculation.
- cx => holds total end-up size for loop-end-check :-)
- dx => holds additional XOR value. }
- asm
- mov ax,seg [xortable]
- mov ds,ax
- mov si,offset [xortable]
- les di,[data]
- mov cx,di
- add cx,[size]
- mov dx,[xoa]
- jmp @@loop
- @@zeroit:
- mov [slidepos],0
- @@loop:
- cmp [slidepos],maxx
- jg @@zeroit { Slidepos become to big? }
- mov bx,si
- add bx,slidepos
- mov ah,ds:[bx]
- mov bx,[slidepos]
-
- mov al,es:[di]
- not al
- xor al,ah
- xor al,dl
- xor al,bl
- xor al,dh
- not al
- xor al,bh
- mov es:[di],al
- inc [slidepos]
- inc di
- cmp di,cx
- jb @@loop
- end;
-
- procedure setslide(const slide:word); assembler;
- asm
- cmp [slide],maxx
- ja @@exit2
- mov ax,[slide]
- mov [slidepos],ax
- jmp @@exit
- @@exit2:
- mov [slidepos],0
- @@exit:
- end;
-
- function maxslide:word; assembler;
- asm
- mov ax,[maxx]
- end;
-
- begin
- slidepos:=0;
- end.